import {
  apiAndPCType,
  apiType,
  Box3Get,
  Box3Post,
  escapeHtml,
} from "@ap/util/request";
import * as vscode from "vscode";
import {
  showErrorMessage,
  showInformationMessage,
} from "@ap/util/vscode/message";
import { auth } from "@ap/util/request";
import { arenaErrorMsg } from "@ap/util/vscode/errorMsg";
import { CommandId } from "@ap/command";

/**
 * 扩展的QuickPickItem接口，包含contentId和contentType两个自定义属性。
 * 用于在VSCode的快速选择列表中显示带有额外信息的项。
 */
interface ExtendedQuickPickItem extends vscode.QuickPickItem {
  contentId: number;
  contentType: number;
}

// 存储系统通知的快速选择项数组。
let items: ExtendedQuickPickItem[];
// 存储被选中项的URL。
let url: string;

/**
 * 异步获取Box3系统的评论列表。
 * @returns 返回一个Promise，解析为ExtendedQuickPickItem数组，表示系统通知的列表。
 */
async function getBox3CommentList(): Promise<ExtendedQuickPickItem[]> {
  // 使用Box3Get函数发起请求，获取系统通知。
  const response = await Box3Get(
    {
      url: "msg/sys?offset=0&limit=100",
    },
    "账号系统评论",
  );

  // 检查响应是否成功，如果不成功，则显示错误消息并返回空数组。
  if (!response || response.code !== 200) {
    showErrorMessage(`获取系统通知失败: ${response?.msg}`);
    return [];
  }

  // 清空items数组，并遍历响应数据，创建并添加快速选择项。
  items = [];
  for (const value of response.data.rows) {
    items.push({
      label: `${escapeHtml(value.msgContent)}`,
      detail: escapeHtml(value.title) + "   时间：" + value.createdAt,
      contentId: value.contentId,
      contentType: value.contentType,
    });
  }
  return items;
}

/**
 * 异步函数，用于选择Box3系统的系统通知。
 * 如果用户未授权，将提示用户登录。
 * 如果获取通知列表失败，将显示错误消息。
 * 如果列表为空，也将显示错误消息。
 * 如果用户选择了某个通知，将根据通知类型打开相应的URL。
 */
export default async function selectBox3SysComment() {
  // 检查用户授权状态，未授权则提示登录。
  if (!auth) {
    showErrorMessage(arenaErrorMsg.LOG_IN_TO_THE_SHINJIMA_ACCOUNT);
    vscode.commands.executeCommand(CommandId.userCenterTool_setting);
    return;
  }
  try {
    // 获取系统通知列表。
    const dataSource = await getBox3CommentList();
    // 处理获取列表失败的情况。
    if (!dataSource) {
      return;
    }
    // 处理列表为空的情况。
    if (!dataSource.length) {
      showErrorMessage(arenaErrorMsg.FAILED_TO_OBTAIN_THE_LIST);
      return;
    }
    // 显示快速选择列表，让用户选择一个通知。
    const selectedOption = await vscode.window.showQuickPick(dataSource, {
      title: "ArenaPro：系统通知，最新100条",
      matchOnDescription: true,
      canPickMany: false,
    });

    // 如果用户选择了某个通知，根据通知类型打开相应的URL。
    if (selectedOption) {
      if (selectedOption.contentType === 1) {
        url =
          apiAndPCType[apiType].pc +
          "exp/experience/detail/" +
          selectedOption.contentId;
      } else {
        url =
          apiAndPCType[apiType].pc +
          "exp/model/detail/" +
          selectedOption.contentId;
      }
      vscode.env.openExternal(vscode.Uri.parse(url));
    }
  } catch (error) {
    // 如果在选择过程中发生错误，显示错误消息。
    showErrorMessage(`选择操作遇到错误: ${error}`);
  }
}
